package com.bigdata.spark.core.wc

import org.apache.spark.{SparkConf, SparkContext}

/**
 * 2020/11/28
 * https://www.bilibili.com/video/BV11A411L7CK?p=7
 * spark word count操作
 */
object Spark01_WordCount {
  def main(args: Array[String]): Unit = {
    //建立和spark框架的连接
    val sparkConf = new SparkConf().setMaster("local[2]").setAppName("word-count")

    val sc = new SparkContext(sparkConf)

    // 执行业务操作

    def plusStep(step:Int) = (num:Int) => num +step
    //给step赋值
    val myFunct = plusStep(3)
    //调用myFunc函数
    println(myFunct(10))
    //在上面的plusStep中， step是一个自由变量，它的值只有在运行的时候才能确定，
    // num的类型是确定的，num的值只有在调用的时候才被赋值。
    // 这样的函数，被称为“闭包”，它反映了一个从开放到封闭的过程
    //闭包会引用函数外部的变量
    var more = 1
    val addMore=(x:Int)=>x+more

    def sum(f: Int => Int, a: Int, b: Int): Int = {
      if(a > b) 0 else f(a) + sum(f, a+1, b)
    }

    def self(x: Int): Int = x
    def square(x: Int): Int = x * x
    def powerOfTwo(x: Int): Int = if(x == 0) 1 else 2 * powerOfTwo(x-1)

    def sumInts(a: Int, b: Int): Int = sum(self, a, b)
    def sumSquared(a: Int, b: Int): Int = sum(square, a, b)
    def sumPowersOfTwo(a: Int, b: Int): Int = sum(powerOfTwo, a, b)
    println(sumInts(1,5))
    println(sumSquared(1,5))
    println(sumPowersOfTwo(1,5))

    // 关闭连接
    sc.stop()
  }
  def counter(value:Int):Int = {
    val value2 = value + 1
    value2
  }
  val counter2: Int => Int = { (x) => x*2  }

  //定义了一个新的函数sum，以函数f为参数
  def sum(f: Int => Int, a: Int, b: Int): Int ={
    if(a > b) 0 else f(a) + sum(f, a+1, b)
  }
  //定义了一个新的函数self，该函数的输入是一个整数x，然后直接输出x自身
  def self(x: Int): Int = x

  //重新定义sumInts函数
  def sumInts(a: Int, b: Int): Int = sum(self, a, b)




}
